package team.niit.bean;

import cn.hutool.core.bean.BeanUtil;
import lombok.Data;
import team.niit.entity.CourseEntity;
import team.niit.entity.StudentCourseEntity;
import team.niit.errorenum.ErrorCodeEnum;
import team.niit.service.CourseService;
import team.niit.service.StudentService;
import team.niit.service.impl.CourseServiceImpl;
import team.niit.service.impl.StudentServiceImpl;
import team.niit.util.NoUtil;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import java.util.ArrayList;
import java.util.List;

@ManagedBean(name = "course")
@SessionScoped
@Data
public class CourseBean {
    /**
     * 编号
     */
    private String id;

    /**
     * 名称
     */
    private String name;

    /**
     * 学分
     */
    private String credit;

    /**
     * 名额
     */
    private Integer quota;

    /**
     * 任课教师
     */
    private String teacher;

    /**
     * 类别
     */
    private String category;

    /**
     * 时间
     */
    private String time;

    /**
     * 周次
     */
    private String week;

    /**
     * 上课地址
     */
    private String address;

    /**
     * 时间索引
     */
    private Integer no;

    /**
     * 所有可选课程
     */
    public List<CourseEntity> optionalCoursesList;

    /**
     * 所有已选课程
     */
    public List<CourseEntity> selectedCoursesList = new ArrayList<>();

    /**
     * 所有课程
     */
    public List<CourseEntity> coursesList;

    ///////////////////////////////////////////////////////////////////
    /**
     * 分页查询的页码
     * 分页查询功能使用前端js进行操控效果更佳
     */
    @Deprecated
    public int pageNumber = 0;

    /**
     * 所有课程的页数
     */
    @Deprecated
    public int totalPage = 0;

    /**
     * 每页大小
     */
    @Deprecated
    public int size = 100;

    /**
     * 所有可选课程数量
     */
    @Deprecated
    public int count = 0;
    ///////////////////////////////////////////////////////////////////////////

    /**
     * Service
     */
    private CourseService courseService = new CourseServiceImpl();
    private StudentService studentService = new StudentServiceImpl();

    /**
     * 获取学生课表
     *
     * @return 返回学生课表的二维数组
     */
    public CourseEntity[][] curriculum(String studentId) {
        return courseService.queryAllCourse(studentId);
    }

    //////////////////////////////////   分页查询   /////////////////////////////////////////////////
    /**
     * 页面初始化时执行，用于初始化课程集合信息，推荐使用paging()方法进行初始化
     */
    // @PostConstruct
    public void init() {
        // paging("first");
    }

    /**
     * 分页查询，根据前端传入的按钮类型，进行相应的查询操作
     *
     * @param type 前端点击的按钮类型
     */
    @Deprecated
    public void paging(String type) {
        this.count = courseService.count();
        totalPage = (int) Math.ceil((double) this.count / this.size);
        switch (type) {
            case "first":
                this.pageNumber = 0;
                break;
            case "previous":
                if (this.pageNumber > 0)
                    this.pageNumber--;
                break;
            case "next":
                if (this.pageNumber < this.totalPage - 1)
                    this.pageNumber++;
                break;
            case "last":
                this.pageNumber = totalPage - 1;
                break;
        }
        optionalCoursesList = courseService.pagingQuery(this.size, this.pageNumber);
    }

    /////////////////////////////////////////////////////////////////////////////////////////

    // 重写getter方法，用于刷新页面值
    public List<CourseEntity> getOptionalCoursesList() {
        // this.count = this.optionalCoursesList.size(); 分页是使用
        return optionalCoursesList = courseService.findOptionalCoursesList();
    }

    // 重写getter方法，用于刷新页面值
    public List<CourseEntity> getCoursesList() {
        return coursesList = courseService.list();
    }

    /////////////////////////////////////  学生选课    //////////////////////////////////////////////
    /**
     * 学生选课
     *
     * @param courseId  课程编号
     * @param studentId 学生编号
     * @return 返回成功与否的提示信息
     */
    public String selectCourse(String courseId, String studentId) {
        ErrorCodeEnum res = courseService.selectCourse(courseId, studentId);
        switch (res) {
            case INSUFFICIENT:
                return "insufficient_quota";
            case OUT_OF_BOUNDS:
                return "/pages/error/out_of_bounds";
            case HAS_BEEN_SELECTED:
                return "/pages/error/has_been_selected";
            case EXIST_OTHER_COURSE:
                return "/pages/error/exist_other_course";
            case INNER_ERROR:
                return "/pages/error/500";
            case SUCCESS:
                return "student_curriculum";
        }
        return "/pages/error/500";
    }

    /**
     * 获取已选课程集合
     *
     * @param studentId 学生编号
     * @return 返回课程已选集合
     */
    public List<CourseEntity> getSelectedCourseList(String studentId) {
        return courseService.findSelectedCourseList(studentId);
    }

    /**
     * 学生退课
     *
     * @param courseId  课程编号
     * @param studentId 学生编号
     * @return 返回成功与否的提示信息
     */
    public void dropCourse(String courseId, String studentId) {
        courseService.dropCourse(courseId, studentId);
    }


    ///////////////////////////////////////  管理员管理课程模块   //////////////////////////////////////////////////

    /**
     * 管理员添加课程
     * @return 跳转到查看课程页面
     */
    public String insertCourse() {
        CourseEntity entity = new CourseEntity();
        BeanUtil.copyProperties(this, entity);
        entity.setNo(NoUtil.getNo(entity.getTime()));
        courseService.addCourse(entity);
        optionalCoursesList = courseService.findOptionalCoursesList();
        return "admin_view_course";
    }

    /*
     * 管理员修改课程
     */
    public String updateCourse() {
        CourseEntity entity = new CourseEntity();
        BeanUtil.copyProperties(this, entity);
        entity.setNo(NoUtil.getNo(entity.getTime()));
        courseService.modifyCourse(entity);
        return "admin_view_course";
    }

    /**
     * 跳转到修改课程页面
     * @param id 课程编号
     * @return 修改课程页面
     */
    public String goToModifyCourse(String id) {
        CourseEntity courseEntity = courseService.getById(id);
        BeanUtil.copyProperties(courseEntity, this);
        return "admin_update_course";
    }


    /**
     * 管理员查看学生已选择的课
     */
    public String getStudentCourseById(String studentId) {
        selectedCoursesList = courseService.getStudentCourseById(studentId);
        return "admin_update_student_course";
    }

    /*
     * 管理员帮学生删课
     */
    public String deleteStudentCourse(String studentId, String courseId) {
        if (courseService.deleteStudentCourse(studentId, courseId)) {
            selectedCoursesList = courseService.findSelectedCourseList(studentId);
            return "admin_update_student_course";
        } else {
            return "../error/500";
        }
    }

    /**
     * 管理员帮学生选课
     */
    public String insertStudentCourse(String studentId, String courseId) {
        StudentCourseEntity studentCourseEntity = new StudentCourseEntity();
        studentCourseEntity.setStudentId(studentId);
        studentCourseEntity.setCourseId(courseId);
        courseService.addStudentCourse(studentId, courseId);
        selectedCoursesList = courseService.findSelectedCourseList(studentId);
        return "admin_update_student_course";
    }

    /*
     * 管理员删除课程信息
     */
    public String deleteCourseById(String id) {
        if (courseService.deleteCourseById(id)) {
            return "admin_view_course";
        } else {
            System.out.println(2);
            return "../error/500";
        }
    }
}
